﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace BaseKnowledge
{
    public class JsonElementDemo
    {
        public static object? GetValue(JsonElement element)
        {
            switch (element.ValueKind)
            {
                case JsonValueKind.String:
                    return element.GetString();
                case JsonValueKind.Number:
                    return element.GetDecimal();
                case JsonValueKind.True:
                case JsonValueKind.False:
                    return element.GetBoolean();
                case JsonValueKind.Array:
                    return element.EnumerateArray().Select(e => GetValue(e)).ToArray();
                case JsonValueKind.Undefined:
                case JsonValueKind.Null:
                    return null;
                case JsonValueKind.Object:
                default:
                    return element;
            }
        }

        public static string GetModelValueByParameters(List<string> tokenParamName, string modelStr)
        {
            var value = string.Empty;
            var bodyJsonDocument = JsonDocument.Parse(modelStr).RootElement;
            var arr = bodyJsonDocument.ValueKind == JsonValueKind.Array ? (IEnumerable<JsonElement>)bodyJsonDocument.EnumerateArray() : new List<JsonElement>() { bodyJsonDocument };
            for (int i = 0; i < tokenParamName.Count; i++)
            {
                var paramName = tokenParamName[i];
                foreach (var item in arr)
                {
                    var isExist = item.TryGetProperty(paramName, out JsonElement jsonele);
                    if (isExist)
                    {
                        if (jsonele.ValueKind != JsonValueKind.Object && jsonele.ValueKind != JsonValueKind.Array)
                        {
                            value = GetValue(jsonele)?.ToString();
                            break;
                        }
                        else
                        {
                            arr = jsonele.ValueKind == JsonValueKind.Array ? (IEnumerable<JsonElement>)jsonele.EnumerateArray() : new List<JsonElement>() { jsonele };
                            continue;
                        }

                    }
                    else
                    {
                        throw new Exception("参数错误");
                    }
                }
            }

            return value;
        }
    }
}
